import { isNull } from './index'
import math from './math'

function anyParamsRule(K_AnyParams = []) {
  let K_AnyParamsRule = ''
  K_AnyParams.forEach(v => {
    K_AnyParamsRule += `|${v}`
  })
  return K_AnyParamsRule
}

function anyParamsRegRule(K_AnyParams = []) {
  let K_AnyParamsRule = ''
  K_AnyParams.forEach((v, i) => {
    K_AnyParamsRule += i === 0 ? `${v}` : `|${v}`
  })
  return new RegExp(`^${K_AnyParamsRule}$`)
}

/**
 * @desc 一位小数 0.1-99999.9
 */
export function test1Decimal(value, K_MinNum = 0.1, K_MaxNum = 99999.9, K_AnyParams = []) {
  const reg = new RegExp(`^([1-9][0-9]*)+(\\.[0-9])?$`)
  const anyParamsReg = anyParamsRegRule(K_AnyParams)
  return (reg.test(value) && !anyParamsReg.test(value) && !(math.mul(value, 10) < math.mul(K_MinNum, 10) || math.mul(value, 10) > math.mul(K_MaxNum, 10))) || anyParamsReg.test(value)
}

/**
 * @desc 两位小数 0.01-99999.99
 */
export function test2Decimal(value, K_MinNum = 0.01, K_MaxNum = 99999.99, K_AnyParams = []) {
  const reg = new RegExp(`^[0-9]+(\\.[0-9]{1,2})?$`)
  const anyParamsReg = anyParamsRegRule(K_AnyParams)
  return (reg.test(value) && !anyParamsReg.test(value) && !(math.mul(value, 100) < math.mul(K_MinNum, 100) || math.mul(value, 100) > math.mul(K_MaxNum, 100))) || anyParamsReg.test(value)
}

/**
 * @desc 正整数 默认1-9999999
 */
export function testPositiveInt(value, K_MinNum = 1, K_MaxNum = 9999999, K_AnyParams = []) {
  const reg = new RegExp(`^[1-9]\\d*$`)
  const anyParamsReg = anyParamsRegRule(K_AnyParams)
  return (reg.test(value) && !anyParamsReg.test(value) && !(value < K_MinNum || value > K_MaxNum)) || anyParamsReg.test(value)
}

/**
 * @desc 匹配英文数字
 */
export function testEngNum(value, K_AnyParams = []) {
  const K_AnyParamsRule = anyParamsRule(K_AnyParams)
  const reg = new RegExp(`^[A-Za-z0-9]*${K_AnyParamsRule}$`)
  return reg.test(value)
}

/**
 * K_MinLen 最小长度限制
 * K_MaxLen 最大长度限制 数字默认为正整数部分
 * K_MinNum 最小值 数字
 * K_MaxNum 最大值 数字
 * K_AnyParams 其它额外值
 * K_ErrMsg 异常返回值
 */

/**
 * @desc 一位小数
 */
export function valid1Decimal(rule, value, callback) {
  const K_ErrMsg = rule.K_ErrMsg || '请输入0.1~99999.9'
  if (isNull(value)) {
    rule.required ? callback(new Error(K_ErrMsg)) : callback()
  } else if (!test1Decimal(value, rule.K_MinNum || 0.01, rule.K_MaxNum || 99999.99, rule.K_AnyParams || [])) {
    callback(new Error(K_ErrMsg))
  } else {
    callback()
  }
}

/**
 * @desc 两位小数
 */
export function valid2Decimal(rule, value, callback) {
  const K_ErrMsg = rule.K_ErrMsg || '请输入0.01~99999.99'
  if (isNull(value)) {
    rule.required ? callback(new Error(K_ErrMsg)) : callback()
  } else if (!test2Decimal(value, rule.K_MinNum || 0.01, rule.K_MaxNum || 99999.99, rule.K_AnyParams || [])) {
    callback(new Error(K_ErrMsg))
  } else {
    callback()
  }
}

/**
 * @desc 匹配正整数
 */
export function validPositiveInt(rule, value, callback) {
  const K_ErrMsg = rule.K_ErrMsg || '请输入正整数'
  if (isNull(value)) {
    rule.required ? callback(new Error(K_ErrMsg)) : callback()
  } else if (!testPositiveInt(value, rule.K_MinNum || 1, rule.K_MaxNum || 9999999, rule.K_AnyParams || [])) {
    callback(new Error(K_ErrMsg))
  } else {
    callback()
  }

  // else if (!K_AnyParams.includes(value) && (value < K_MinNum || value > K_MaxNum)) {
  //   callback(new Error(K_ErrMsg))
  // }
  // else {
  //   callback()
  // }
}

/**
 * @desc 匹配数字 大小写字母
 */
export function validEngNum(rule, value, callback) {
  const K_MinLen = rule.K_MinLen || 6
  const K_MaxLen = rule.K_MaxLen || 12
  const K_AnyParams = rule.K_AnyParams || []
  const K_ErrMsg = rule.K_ErrMsg || '请输入数字，大小写字母'
  if (isNull(value)) {
    rule.required ? callback(new Error(K_ErrMsg)) : callback()
  } else if (!testEngNum(value)) {
    callback(new Error(K_ErrMsg))
  } else if (!K_AnyParams.includes(value) && !(value.length < K_MinLen || value.length > K_MaxLen)) {
    callback(new Error(K_ErrMsg))
  } else {
    callback()
  }
}
